﻿using System;
using System.Transactions;
using KillBill.Business.Entities;
using KillBill.Business.Entities.ListEntities;
using KillBill.Data.DataAccess;
using KillBill.Services.DTO;
using System.Linq;

namespace KillBill.Business.Modules.Suppliers
{
    public class SuppliersManager
    {
        private readonly KillBillEntities _context;
        public SuppliersManager()
        {
            _context = new KillBillEntities();
        }

        #region SupplierRegion

        public ProviderList GetProviders()
        {
            var list = new ProviderList();
            try
            {
                list.Success = true;
                list.Messages.Add("Lista de proveedores fue consultada con éxito.");
                list.Providers = _context.Provider.Include("Person").ToList();
            }
            catch (Exception ex)
            {
                list.Success = false;
                list.Messages.Add("La lista de proveedores no puede ser obtenida.");
                list.Messages.Add(ex.Message);
            }
            return list;
        }

        public ProviderList FindProviders(string value)
        {
            if (value == "") return GetProviders();
            var list = new ProviderList();
            try
            {
                list.Success = true;
                list.Messages.Add("Lista de proveedores fue consultada con éxito.");
                list.Providers = _context
                    .Provider
                    .Include("Person")
                    .Where(p => (
                        p.Person.FirstName + " " +
                        p.Person.LastName + " " +
                        p.ProviderRUC + " " +
                        p.Name
                    ).Contains(value))
                    .ToList();
            }
            catch (Exception ex)
            {
                list.Success = false;
                list.Messages.Add("La lista de proveedores no puede ser obtenida.");
                list.Messages.Add(ex.Message);
            }
            return list;
        }

        public Provider AddProvider(Provider provider)
        {
            try
            {
                using (var ts = new TransactionScope())
                {
                    provider.Person.ModifiedDate = DateTime.Now;
                    _context.Person.AddObject(provider.Person);
                    provider.ModifiedDate = DateTime.Now;
                    _context.AddObject("Provider",provider);
                    _context.SaveChanges();
                    provider.Success = true;
                    provider.Messages.Add("El proveedor ha sido agregado con éxito");
                    ts.Complete();
                    return provider;
                }
            }
            catch (Exception ex)
            {
                provider.Messages.Clear();
                provider.Success = false;
                provider.Messages.Add("Se produjo un error al agregar el proveedor");
                provider.Messages.Add(ex.Message);
                return provider;
            }
        }
        public Provider UpdateProvider(Provider provider)
        {
            try
            {
                using (var ts = new TransactionScope())
                {
                    provider.ModifiedDate = DateTime.Now;
                    _context.Provider.ApplyChanges(provider);
                    _context.SaveChanges();
                    provider.Success = true;
                    provider.Messages.Add("El proveedor ha sido actualizado con éxito");
                    ts.Complete();
                    return provider;
                }
            }
            catch (Exception ex)
            {
                provider.Messages.Clear();
                provider.Success = false;
                provider.Messages.Add("Se produjo un error al actualizar el proveedor");
                provider.Messages.Add(ex.Message);
                return provider;
            }
        }
        public KillBillDTO DeteleProvider(Provider provider)
        {
            var killBillDto = new KillBillDTO();
            try
            {
                using (var ts = new TransactionScope())
                {
                    provider.ModifiedDate = DateTime.Now;
                    provider.IsActive = false;
                    _context.Provider.ApplyChanges(provider);
                    _context.SaveChanges();
                    killBillDto.Success = true;
                    killBillDto.Messages.Add("El proveedor ha sido eliminado con éxito");
                    ts.Complete();
                    return provider;
                }
            }
            catch (Exception ex)
            {
                killBillDto.Messages.Clear();
                killBillDto.Success = false;
                killBillDto.Messages.Add("Se produjo un error al eliminar el proveedor");
                killBillDto.Messages.Add(ex.Message);
                return killBillDto;
            } 
        }
        /*
        public ProviderList GetProvidersIsActive()
        {
            var providerList = new ProviderList();
            try
            {
                providerList.Providers= _context.Provider.Where(p => p.IsActive).ToList();
                providerList.Success = true;
                providerList.Messages.Add("Los proveedores han sido recuperados con éxito");
                return providerList;
            }
            catch (Exception ex)
            {
                providerList.Success = false;
                providerList.Messages.Clear();
                providerList.Messages.Add("Se produjo un error al recuperar los proveedores");
                providerList.Messages.Add(ex.Message);
                return providerList;
            }
        }
         */
        #endregion
    }
}
